#include <iostream>
#include <pthread.h>

// 没有加锁，几个线程同时减减，很容易将车票减成负数。

int ticket = 1000;

// 全局锁
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void* Sell(void* argv)
{
    char* id = (char*)argv;

    while(true)
    {
        // 给共享的资源加锁(临界资源)，也可以理解为对该线程的保护。
        pthread_mutex_lock(&lock);
        if(ticket > 0)
        {
            // 在里面加锁，还是会有线程进入判断的。
            std::cout << id << "成功购票,ticket:" << ticket << std::endl;
            --ticket;
            pthread_mutex_unlock(&lock);
        }
        else
        {
            pthread_mutex_unlock(&lock);
            break;
        }
    }

    return nullptr;
}

int main()
{
    // 局部锁。
    // pthread_mutex_t lock;

    // pthread_mutex_init(&lock,nullptr);

    pthread_t t1 , t2 , t3 , t4;

    pthread_create(&t1,nullptr,Sell,(void*)"thread 1");
    pthread_create(&t2,nullptr,Sell,(void*)"thread 2");
    pthread_create(&t3,nullptr,Sell,(void*)"thread 3");
    pthread_create(&t4,nullptr,Sell,(void*)"thread 4");

    void* ret1 , * ret2 , *ret3 , *ret4;

    pthread_join(t1,&ret1);
    pthread_join(t2,&ret2);
    pthread_join(t3,&ret3);
    pthread_join(t4,&ret4);

    return 0;
}